package com.lecture.java8.genericity;

import java.util.HashMap;
import java.util.Map;

/**
 * @author luyn
 * @description
 * @Date 2020/9/22 19:38
 * @version 1.0
 */
public class GenericMain {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        // 泛型的规定类型参数只能是类类型，不能是基本的类型
        // 传入的实参类型需与定义的泛型参数类型一样，即Integer
       /* Generic<Integer> genericInteger = new Generic<>(1);

        // 传入的实参类型需与定义的泛型类型相同，即String
        Generic<String> genericString = new Generic<>("hello");

        System.out.println(genericInteger.getVar());
        System.out.println(genericString.getVar());

        Generic<Number> genericNumber = new Generic<>(2);

        GenericMain genericMain = new GenericMain();
        genericMain.showGeneric(genericNumber);

        Generic generic = genericMain.genericMethod(Generic.class);*/

       // GenericTest.show("s");
        Map<Long, Integer> map = new HashMap<>();
        map.put(1231231432132123123L, 34);
        System.out.println(map.get(1231231432132123123L));
    }

    public void showGeneric(Generic<?> generic) {
        System.out.println("--------------");
        System.out.println(generic.getVar());
    }

    /**
     * 泛型方法
     * @author luyn
     * @date 2020/9/22 19:59
     * @param tClass 实参
     * @return T 返回类型
     * 说明：1（public 与 返回类型之间的<T>非常重要，可以理解为声明此方法为泛型方法。
     *      2（只有声明了<T>的方法才是泛型方法，泛型类中使用了泛型成员的方法不是泛型方法。
     *      3：<T>表示该方法将使用泛型类型T，此时才可以在方法中使用泛型类型T
     *      4：与泛型类的定义一样，此处T可以随便写成任意标识。例如T，E，K，V等常见的泛型标识
     */
    public <T> T genericMethod(Class<T> tClass) throws IllegalAccessException, InstantiationException {
        T instance = tClass.newInstance();
        return instance;
    }
}
